function ajax(option) {
  let defauldOption = {
    type: 'get',
    async: true,
    data: ''
  }
  let params = Object.assign(defauldOption, option);

  if (!params.url) {
    throw Error('url参数是必填')
  }
  if (Object.prototype.toString.call(params.url) != '[object String]') {
    throw Error('url参数的值 必须是string类型')
  }

  if (!params.success) {
    throw Error('success 回调函数是必填参数');
  }
  if (Object.prototype.toString.call(params.success) != '[object Function]') {
    throw Error('success的值必须是一个函数')
  }
  if (Object.prototype.toString.call(params.type) != '[object String]') {
    throw Error('type 属性的属性值必须是字符串')
  }
  if (!/(get|post)/gi.test(params.type)) {
    throw Error('type 属性只能为 get 或者 post')
  }

  if (Object.prototype.toString.call(params.async) != '[object Boolean]') {
    throw Error('async 属性的值必须为布尔值')
  }

  let dataType = Object.prototype.toString.call(params.data)
  if (dataType != '[object String]' && dataType != '[object Object]') {
    throw Error('data 属性的值必须是string或者Object类型')
  }
  if (dataType == '[object Object]') {
    let arr = []
    for (let key in params.data) {
      arr.push(key + '=' + params.data[key])
    }
    params.data = arr.join('&');
  }

  let xhr = new XMLHttpRequest();
  if (params.type == 'get') {
    if (params.data.indexOf('{') != -1) {
      let data = JSON.parse(params.data);
      let arr = []
      for (let key in data) {
        arr.push(key + '=' + data[key])
      }
      params.data = arr.join('&');
    }
    let url = params.data ? params.url + '?' + params.data : params.url;
    xhr.open(params.type, url, params.async);
    xhr.send()
  } else {
    xhr.open(params.type, params.url, params.async);
    let type = params.data.indexOf('=') != -1 ? 'application/x-www-form-urlencoded' : 'application/json';
    xhr.setRequestHeader('Content-Type', type)
    xhr.send(params.data)
  }
  if (params.async == false) {
    params.success(JSON.parse(xhr.responseText))
    return
  }
  xhr.onload = function () {
    params.success(JSON.parse(xhr.responseText))
  }
}